#ifndef THREAD_TEST_V1_H
#define THREAD_TEST_V1_H


#include <iostream>
#include <vector>
#include <queue>
#include <functional>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>
#include <memory>
#include <chrono>

class thread_test_V1
{
public:
    // 获取线程池单例实例
    static thread_test_V1& getInstance(size_t numThreads = std::thread::hardware_concurrency()) {
        static thread_test_V1 instance(numThreads);
        return instance;
    }

    // 禁用拷贝构造和赋值
    thread_test_V1(const thread_test_V1&) = delete;
    thread_test_V1& operator=(const thread_test_V1&) = delete;

    /**
      @brief 提交任务到线程池

      @param cancelableTaskFunc 可取消的任务函数，接受一个 shared_ptr<atomic<bool>> 参数作为取消标志
      @param normalTaskFunc 普通任务函数，不支持取消
      @param supportCancel 是否支持取消
      @param priority 任务优先级，数值越小优先级越高，默认 100
      @param timeout 超时时间，默认无限大
      @return std::shared_ptr<std::atomic<bool>> 如果是可取消任务，返回取消标志；否则返回 nullptr
     */
    std::shared_ptr<std::atomic<bool>> enqueue_task(
        std::function<void(std::shared_ptr<std::atomic<bool>>)> cancelableTaskFunc,
        std::function<void()> normalTaskFunc,
        bool supportCancel,
        int priority = 100,
        std::chrono::milliseconds timeout = std::chrono::milliseconds::max()
        );

private:
    thread_test_V1(size_t numThreads);
    ~thread_test_V1();

    // 任务类型
    struct Task {
        int priority;                         // 任务优先级
        std::function<void()> func;           // 任务函数
        size_t id;                            // 任务 ID（用于后期扩展功能）
    };

    // 比较任务优先级，用于优先级队列
    struct Compare {
        bool operator()(const Task& a, const Task& b) {
            return a.priority > b.priority;   // 数值小的优先级高
        }
    };

    std::priority_queue<Task, std::vector<Task>, Compare> taskQueue; // 任务队列
    std::vector<std::thread> workers;        // 工作线程
    std::mutex queueMutex;                   // 队列互斥锁
    std::condition_variable condition;       // 条件变量
    bool stop = false;                       // 停止标志
    size_t taskCounter = 0;                  // 任务计数器（用于生成任务 ID）
};

#endif // THREAD_TEST_V1_H
